<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $model backend\modules\tool\models\FillForTemplate */
/* @var $form yii\widgets\ActiveForm */
$before_post=<<<js
if($("#fillfortemplate-template").val().trim()!=''){
    $("#fillfortemplate-template").val(formatJson($("#fillfortemplate-template").val()));
}
$("form").submit(function() {
  return onsubmit();
});
function onsubmit() {
    var value=$("#fillfortemplate-template").val();
    try {
      value=JSON.parse(value);
      $("#fillfortemplate-template").val(JSON.stringify(value));
    }
    catch (e) {
        console.log(e);
        alert("无法解析改规则,模板JSON可能有误");
      return false;
    }
}
js;
$this->registerJs($before_post);
?>
<div class="fill-for-template-form">

    <?php $form = ActiveForm::begin(); ?>
    <?= \backend\modules\tool\helpers\widgets\SwitcButton::widget([
            "filed"=>"key",
            "model"=>$model
    ]) ?>
    <?= $form->field($model, 'key')->textInput() ?>
<!--    --><?//= $form->field($model, 'p_key')->textInput() ?>
    <?= $form->field($model, 'primary_key')->textInput() ?>
    <?= $form->field($model, 'title')->textInput() ?>
    <?= $form->field($model, 'template')->textarea(['rows' =>15]) ?>
    <div class="form-group">
        <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>
<script>
    function transitionJsonToString (jsonObj, callback) {
        // 转换后的jsonObj受体对象
        var _jsonObj = null;
        // 判断传入的jsonObj对象是不是字符串，如果是字符串需要先转换为对象，再转换为字符串，这样做是为了保证转换后的字符串为双引号
        if (Object.prototype.toString.call(jsonObj) !== "[object String]") {
            try {
                _jsonObj = JSON.stringify(jsonObj);
            } catch (error) {
                // 转换失败错误信息
                console.error('您传递的json数据格式有误，请核对...');
                console.error(error);
                callback(error);
            }
        } else {
            try {
                jsonObj = jsonObj.replace(/(\')/g, '\"');
                _jsonObj = JSON.stringify(JSON.parse(jsonObj));
            } catch (error) {
                // 转换失败错误信息
                console.error('您传递的json数据格式有误，请核对...');
                console.error(error);
                callback(error);
            }
        }
        return _jsonObj;
    }
    // callback为数据格式化错误的时候处理函数
    function formatJson (jsonObj, callback) {
        // 正则表达式匹配规则变量
        var reg = null;
        // 转换后的字符串变量
        var formatted = '';
        // 换行缩进位数
        var pad = 0;
        // 一个tab对应空格位数
        var PADDING = '    ';
        // json对象转换为字符串变量
        var jsonString = transitionJsonToString(jsonObj, callback);
        if (!jsonString) {
            return jsonString;
        }
        // 存储需要特殊处理的字符串段
        var _index = [];
        // 存储需要特殊处理的“再数组中的开始位置变量索引
        var _indexStart = null;
        // 存储需要特殊处理的“再数组中的结束位置变量索引
        var _indexEnd = null;
        // 将jsonString字符串内容通过\r\n符分割成数组
        var jsonArray = [];
        // 正则匹配到{,}符号则在两边添加回车换行
        jsonString = jsonString.replace(/([\{\}])/g, '\r\n$1\r\n');
        // 正则匹配到[,]符号则在两边添加回车换行
        jsonString = jsonString.replace(/([\[\]])/g, '\r\n$1\r\n');
        // 正则匹配到,符号则在两边添加回车换行
        jsonString = jsonString.replace(/(\,)/g, '$1\r\n');
        // 正则匹配到要超过一行的换行需要改为一行
        jsonString = jsonString.replace(/(\r\n\r\n)/g, '\r\n');
        // 正则匹配到单独处于一行的,符号时需要去掉换行，将,置于同行
        jsonString = jsonString.replace(/\r\n\,/g, ',');
        // 特殊处理双引号中的内容
        jsonArray = jsonString.split('\r\n');
        jsonArray.forEach(function (node, index) {
            // 获取当前字符串段中"的数量
            var num = node.match(/\"/g) ? node.match(/\"/g).length : 0;
            // 判断num是否为奇数来确定是否需要特殊处理
            if (num % 2 && !_indexStart) {
                _indexStart = index
            }
            if (num % 2 && _indexStart && _indexStart != index) {
                _indexEnd = index
            }
            // 将需要特殊处理的字符串段的其实位置和结束位置信息存入，并对应重置开始时和结束变量
            if (_indexStart && _indexEnd) {
                _index.push({
                    start: _indexStart,
                    end: _indexEnd
                })
                _indexStart = null
                _indexEnd = null
            }
        })
        // 开始处理双引号中的内容，将多余的"去除
        _index.reverse().forEach(function (item, index) {
            var newArray = jsonArray.slice(item.start, item.end + 1)
            jsonArray.splice(item.start, item.end + 1 - item.start, newArray.join(''))
        })
        // 奖处理后的数组通过\r\n连接符重组为字符串
        jsonString = jsonArray.join('\r\n');
        // 将匹配到:后为回车换行加大括号替换为冒号加大括号
        jsonString = jsonString.replace(/\:\r\n\{/g, ':{');
        // 将匹配到:后为回车换行加中括号替换为冒号加中括号
        jsonString = jsonString.replace(/\:\r\n\[/g, ':[');
        // 将上述转换后的字符串再次以\r\n分割成数组
        jsonArray = jsonString.split('\r\n');
        // 将转换完成的字符串根据PADDING值来组合成最终的形态
        jsonArray.forEach(function (item, index) {
            var i = 0;
            // 表示缩进的位数，以tab作为计数单位
            var indent = 0;
            // 表示缩进的位数，以空格作为计数单位
            var padding = '';
            if (item.match(/\{$/) || item.match(/\[$/)) {
                // 匹配到以{和[结尾的时候indent加1
                indent += 1
            } else if (item.match(/\}$/) || item.match(/\]$/) || item.match(/\},$/) || item.match(/\],$/)) {
                // 匹配到以}和]结尾的时候indent减1
                if (pad !== 0) {
                    pad -= 1
                }
            } else {
                indent = 0
            }
            for (i = 0; i < pad; i++) {
                padding += PADDING
            }
            formatted += padding + item + '\r\n'
            pad += indent
        });
        // 返回的数据需要去除两边的空格
        return formatted.trim();
    }
</script>
